from sqlalchemy import Table, Column, Integer, ForeignKey

from app import db
from flask_login import UserMixin



# 中间表
class SC(db.Model):
    __tablename__ = 'sc'
    # 定义你的列
    student_id = db.Column(db.Integer, primary_key=True)
    class_id = db.Column(db.Integer, primary_key=True)



# 用户模型
class Users(UserMixin, db.Model):
    """
    用户模型，用于存储用户信息。
    继承自UserMixin以支持Flask-Login的用户会话管理。
    """
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)  # 用户的唯一标识符
    username = db.Column(db.String(150), unique=True, nullable=False)  # 用户名，必须唯一
    password = db.Column(db.String(150), nullable=False)  # 用户的密码，已加密存储
    role = db.Column(db.String(50), nullable=False)  # 用户角色，可能的值为'student'或'teacher'

# 课程模型
class Courses(db.Model):
    """
    课程模型，用于存储课程信息。
    """
    __tablename__ = 'courses'
    id = db.Column(db.Integer, primary_key=True)  # 课程的唯一标识符
    name = db.Column(db.String(100), nullable=False)  # 课程名称
    description = db.Column(db.String(255))  # 课程描述，可选

# 班级模型
class Classes(db.Model):
    """
    班级模型，用于存储班级信息。
    每个班级属于一个课程，并由一个教师管理。
    """
    __tablename__ = 'classes'
    id = db.Column(db.Integer, primary_key=True)  # 班级的唯一标识符
    course_id = db.Column(db.Integer, db.ForeignKey('courses.id'), nullable=False)  # 关联的课程ID
    teacher_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)  # 负责该班级的教师ID
    name = db.Column(db.String(100), nullable=False)  # 班级名称




# 作业模型
class Assignments(db.Model):
    """
    作业模型，用于存储作业信息。
    每个作业属于一个班级。
    """
    __tablename__ = 'assignments'
    id = db.Column(db.Integer, primary_key=True)  # 作业的唯一标识符
    class_id = db.Column(db.Integer, db.ForeignKey('class.id'), nullable=False)  # 关联的班级ID
    title = db.Column(db.String(100), nullable=False)  # 作业标题
    content = db.Column(db.Text, nullable=False)  # 作业内容或描述

class Submissions(db.Model):
    """
    提交模型，用于存储学生提交的作业信息。
    每个提交关联到一个作业和一个学生。
    """
    __tablename__ = 'submissions'

    id = db.Column(db.Integer, primary_key=True)  # 提交的唯一标识符
    assignment_id = db.Column(db.Integer, db.ForeignKey('assignment.id'), nullable=False)  # 关联的作业ID
    student_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)  # 提交作业的学生ID
    grade = db.Column(db.Float)  # 作业评分，可为空表示尚未评分
    file_path = db.Column(db.String(255))  # 文件路径


